package com.congwulin.wechat.util.service.bill;

import com.congwulin.wechat.entity.common.AbstractMeBillVO;
import com.congwulin.wechat.entity.common.SuperVO;
import com.congwulin.wechat.util.EntityConst;
import com.congwulin.wechat.util.SpringUtil;
import com.congwulin.wechat.util.UserInfoUtil;
import com.congwulin.wechat.util.interfaces.AbstractBillService;
import com.congwulin.wechat.util.interfaces.IBillPersistent;

import java.sql.Timestamp;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class BillUpdateService extends AbstractBillService{
    /**
     * 一主多子实体抽象服务构造函数
     *
     * @param dao 一主多子实体保存数据库器
     */
    public BillUpdateService(IBillPersistent dao) {
        super(dao);
    }

    /**
     * 修改一主多子实体数组
     *
     * @param vos 一主多子实体数组
     * @return  保存后的一主多子实体列表
     */
    public List<AbstractMeBillVO> update(AbstractMeBillVO[] vos) {
        List<AbstractMeBillVO> list = Arrays.asList(vos);
        return (List<AbstractMeBillVO>) this.update(list);
    }

    /**
     * 修改一主多子实体列表
     *
     * @param list 一主多子实体列表
     * @return  保存后的一主多子实体数组
     */
    @SuppressWarnings("unchecked")
    public List<?> update(List<?> list) {
        List<AbstractMeBillVO> paralist = (List<AbstractMeBillVO>) list;

        BillTool tool = new BillTool();
        Map<Class<?>, List<SuperVO>> values = tool.group(paralist,
                EntityConst.UPDATE);
        Map<Class<?>, List<SuperVO>> deletevalues = tool.group(paralist,
                EntityConst.DELETE);
        for(Class<?> clazz:values.keySet()){
            if(deletevalues.containsKey(clazz)){
                values.get(clazz).addAll(deletevalues.get(clazz));
            }
        }
        Map<String,String> lockmap = null;
        try {
            // 加锁、校验时间戳
            lockmap = this.lock(values);
            this.checkTs(values);

            // 设置修改审计信息
            this.setUpdateAuditInfo(paralist);

            this.getDAO().update(paralist);
        } finally {
            // 释放锁
            this.unlock(lockmap);
        }

        return list;
    }

    private void setUpdateAuditInfo(List<AbstractMeBillVO> list) {
        // 修改时间
        Timestamp modifiedtime = new Timestamp(System.currentTimeMillis());
        // 修改人
        UserInfoUtil util = SpringUtil.getBean(UserInfoUtil.class);
        String modifier = util.getContent().getId();
        String modifiername = util.getContent().getName();

        for (AbstractMeBillVO bill : list) {
            SuperVO head = bill.getHead();
            head.setModifiedtime(modifiedtime);
            head.setModifier(modifier);
            head.setModifier_name(modifiername);
        }
    }
}
